perm filename PGFAI.FAI[VIS,HPM]2 blob
sn#423205 filedate 1979-03-07 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00014 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE PGFAI
C00004 00003 T←0 ↔ YLO←←1 ↔ XLO←←2 ↔ YHI←←3 ↔ XHI←←4 ↔ PIC←7
C00006 00004 BITUP PMIDI PBSK XLMSK XRMSK
C00007 00005 HORUP
C00009 00006 VERUP: 0 ROUTINE FOR MAKING A VERTICAL
C00010 00007 DELT←6 ↔ DIND←12 ↔ XLO←14 ↔ YLO←15
C00014 00008 XL: 0.0
C00016 00009 XLITEN XDRKEN XINVEN
C00017 00010 PDOT: SAVAC(10)
C00018 00011 PLINE: SAVAC(16) DRAW A LINE FORM (X1,Y1) TO (X2,Y2)
C00019 00012 EXTERN $$$PX,$$$PY,$$$RNK,$$$DXS,$$$NS,$$LOUT,$$$LXS
C00021 00013 SAVN: 0
C00026 00014 END
C00027 ENDMK
C⊗;
TITLE PGFAI
;MAKES LINES AND THINGS IN ONE BIT PICTURES
ENTRY PDDINI,PSCREE,PSCREM,PLINE,PDOT,PPOLYG
ENTRY PDRKEN,PLITEN,PINVEN
ENTRY PBSK,PMIDI
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←13
LINTAB←←14
PIC←7
P←17
NWDS: 0 ;number of words in scanline, including border
XLOO:0 ;X offset
XLOL:0 ;left limit
XHIL:0 ;right limit
YLOO:0 ;Y offset
YLOL:0 ;top limit
YHIL:0 ;bottom limit
NLINA:0 ;virtual buffer height for SCREEN calculation
NBITA:0 ;virtual width
RETAD: 0
ACS: BLOCK 20
DEFINE SAVAC(N)
< IFGE N-12,{MOVEM 12,ACS+12}
IFGE N-16,{MOVEM 16,ACS+16}
IFGE N-17,{MOVEM 17,ACS+17} >
DEFINE RESAC(N)
< IFGE N-12,{MOVE 12,ACS+12}
IFGE N-16,{MOVE 16,ACS+16}
IFGE N-17,{MOVE 17,ACS+17} >
define fix(x)<kifix x,x>
T←0 ↔ YLO←←1 ↔ XLO←←2 ↔ YHI←←3 ↔ XHI←←4 ↔ PIC←7
PDDINI: POP P,RETAD
POP P,XHI
POP P,YHI
POP P,XLO
POP P,YLO
POP P,PIC
CAMLE XLO,XHI
EXCH XLO,XHI
CAMLE YLO,YHI
EXCH YLO,YHI
MOVE T,YHI ;height, for SCREEN calculation
SUB T,YLO
ADDI T,1
MOVEM T,NLINA
MOVE T,XHI ;width, for SCREEN calculation
SUB T,XLO
ADDI T,1
MOVEM T,NBITA
MOVEM XLO,XLOO ;X offset for deposits
MOVEM YLO,YLOO ;Y offset
CAIGE XLO,0
MOVEI XLO,0
MOVEM XLO,XLOL ;physical left limit
CAIGE YLO,0
MOVEI YLO,0
MOVEM YLO,YLOL ;physical top limit
MOVE T,LNBY(PIC)
SUBI T,1
CAMLE XHI,T
MOVE XHI,T
MOVEM XHI,XHIL ;physical right limit
MOVE T,PCLN(PIC)
SUBI T,1
CAMLE YHI,T
MOVE YHI,T
MOVEM YHI,YHIL ;pyhsical bottom limit
MOVE YLO,LNWD(PIC)
MOVEM YLO,NWDS ;save scanlinesize
IMUL YLO,YLOO
MOVE T,LINTAB(PIC)
ADD T,YLO ;Y offset can be done implicitly
HRRM T,PMIDI
MOVN YLO,YLOO
ADDM YLO,YLOL
ADDM YLO,YHIL
JRST @RETAD
;BITUP PMIDI PBSK XLMSK XRMSK
X1←1 ↔ XA←2 ↔ X2←3 ↔ XB←4 ↔ Y1←5 ↔ Y2←11
XRMSK: FOR I←0,43,1 { (-1)⊗(-I)
}
XLMSK: FOR I←0,43,1 { ¬(377777777777⊗(-I))
}
PBSK: FOR I←0,43,1 { 400000000000 ⊗ (-I)
}
BITUP: 0 ;ROUTINE FOR PLACING A BIT AT (X1,Y1)
CAML Y1,YLOL
CAMLE Y1,YHIL
JRST @BITUP
ADD X1,XLOO
CAML X1,XLOL
CAMLE X1,XHIL
JRST @BITUP
IDIVI X1,44
MOVE 10,PBSK(XA)
IMUL Y1,NWDS
ADD X1,Y1
PMIDI: ORM 10,(X1)
JRST @BITUP
;HORUP
HORUP: 0 ;ROUTINE FOR PUTTING UP A HORIZONTAL
CAML Y1,YLOL ;LINE AT Y1, BETWEEN X1 AND X2
CAMLE Y1,YHIL
JRST @HORUP
ADD X1,XLOO
ADD X2,XLOO
CAMLE X1,X2
EXCH X1,X2
CAML X2,XLOL
CAMLE X1,XHIL
JRST @HORUP
CAMGE X1,XLOL
MOVE X1,XLOL
CAMLE X2,XHIL
MOVE X2,XHIL
IDIVI X1,44
IDIVI X2,44
MOVE 10,XRMSK(XA)
SUB X2,X1
MOVE 0,Y1
IMUL 0,NWDS
ADD X1,0
JUMPG X2,NOTE
AND 10,XLMSK(XB)
XCT PMIDI
JRST @HORUP
NOTE: XCT PMIDI
SETO 10,
LMDL: AOS X1
SOJLE X2,FINE
XCT PMIDI
AOJA X1,LMDL+1
FINE: MOVE 10,XLMSK(XB)
XCT PMIDI
JRST @HORUP
VERUP: 0 ;ROUTINE FOR MAKING A VERTICAL
ADD X1,XLOO
CAML X1,XLOL ;LINE AT X1 BETWEEN Y1 AND Y2
CAMLE X1,XHIL
JRST @VERUP
CAML Y1,Y2
EXCH Y1,Y2
CAML Y2,YLOL
CAMLE Y1,YHIL
JRST @VERUP
CAMGE Y1,YLOL
MOVE Y1,YLOL
CAMLE Y2,YHIL
MOVE Y2,YHIL
SUBI Y2,1
IDIVI X1,44
MOVE 10,PBSK(XA)
MOVE 0,Y1
IMUL 0,NWDS
ADD X1,0
VLP: XCT PMIDI
CAML Y1,Y2
JRST @VERUP
ADD X1,NWDS
AOJA Y1,VLP
DELT←6 ↔ DIND←12 ↔ XLO←14 ↔ YLO←15
OBLUP: 0 ;ROUTINE FOR DRAWING AN OBLIQUE
SUB X2,X1 ;LINE FROM (X1,Y1) TO (X2,Y2)
SUB Y2,Y1
MOVM XLO,X2
MOVM YLO,Y2
MOVEI DELT,400000
CAMLE XLO,YLO
JRST DXGR
DYGR: JUMPGE X2,DYPDXL
MOVN X2,X2
MOVN Y2,Y2
SUB X1,X2
SUB Y1,Y2
DYPDXL: HRL DELT,Y2
AOS DIND,X2
IDIV DELT,X2
HRLZ YLO,Y1
MOVE XLO,X1
SGLP: MOVE Y2,DELT
ADDB YLO,Y2
HLRE Y2,Y2
JSR VERUP
SOJLE DIND,@OBLUP
AOS X1,XLO
HLRE Y1,YLO
JRST SGLP
DXGR: JUMPGE Y2,DYPDXG
MOVN X2,X2
MOVN Y2,Y2
SUB X1,X2
SUB Y1,Y2
DYPDXG: HRL DELT,X2
AOS DIND,Y2
IDIV DELT,Y2
HRLZ XLO,X1
MOVE YLO,Y1
SIGLP1: MOVE X2,DELT
ADDB X2,XLO
HLRE X2,X2
JSR HORUP
SOJLE DIND,@OBLUP
AOS Y1,YLO
HLRE X1,XLO
JRST SIGLP1
XL: 0.0
XH: 1.0
XSC: 1476.0
YL: 0.0
YH: 1.0
YSC: 2048.0
PSCREE: SAVAC(3) ;SET UP SCREEN DIMENSIONS
POP P,RETAD ;SCREEN(XL,YL,XH,YH)
POP P,YL ;DEFAULT XL=0.0 YH=1.0
POP P,XH ; YL=0.0 YH=1.0
POP P,YH
POP P,XL
MOVE 1,XH
FSBR 1,XL
FLTR 3,NBITA
FMPR 3,[0.9999]
FDVR 3,1
MOVEM 3,XSC
MOVE 1,YH
FSBR 1,YL
FLTR 3,NLINA
FMPR 3,[0.9999]
FDVR 3,1
MOVEM 3,YSC
RESAC(3)
JRST @RETAD
PSCREM: POP P,RETAD
POP P,1
MOVE 2,YL
MOVEM 2,(1)
POP P,1
MOVE 2,XH
MOVEM 2,(1)
POP P,1
MOVE 2,YH
MOVEM 2,(1)
POP P,1
MOVE 2,XL
MOVEM 2,(1)
JRST @RETAD
;XLITEN XDRKEN XINVEN
PLITEN: MOVE 1,[ ORM 10,(X1)] ;OUTPUTS TO APPEAR BRIGHT
HLLM 1,PMIDI ;(ACTUALLY DARK TONER ON XGP)
POPJ P,
PDRKEN: MOVE 1,[ ANDCAM 10,(X1)] ;OUTPUTS DARK
HLLM 1,PMIDI ;(WHITE, ACTUALLY, PAPER SHOWS THRU)
POPJ P,
PINVEN: MOVE 1,[ XORM 10,(X1)] ;OUTPUTS TO NEGATE PREVIUS DISPLAY
HLLM 1,PMIDI
POPJ P,
PDOT: SAVAC(10)
POP P,RETAD
POP P,Y1
FSBR Y1,YL
FMPR Y1,YSC
FIX Y1
POP P,X1
FSBR X1,XL
FMPR X1,XSC
FIX X1
JSR BITUP
RESAC(10)
JRST @RETAD
PLINE: SAVAC(16) ;DRAW A LINE FORM (X1,Y1) TO (X2,Y2)
POP P,RETAD
POP P,Y2
FSBR Y2,YL
FMPR Y2,YSC
FIX Y2
POP P,X2 ;LINE(X1,Y1,X2,Y2)
FSBR X2,XL
FMPR X2,XSC
FIX X2
POP P,Y1
FSBR Y1,YL
FMPR Y1,YSC
FIX Y1
POP P,X1
FSBR X1,XL
FMPR X1,XSC
FIX X1
JSR OBLUP
RESAC(16)
JRST @RETAD
EXTERN $$$PX,$$$PY,$$$RNK,$$$DXS,$$$NS,$$LOUT,$$$LXS
X1←1 ↔ XA←2 ↔ JJ←2
X2←3 ↔ XB←4 ↔ T←4
Y1←5
Y2←←6
I←←7
II←←12
N←13
J←←14
TT←←15
TTT←←16
P←17
PPOLYG: movem 12,ac12# ;FILL IN AN N SIDED POLYGON
movem 16,ac16#
POP P,RETAD ; POLYGO(N,X,Y)
POP P,Y2 ; X AND Y ARE EACH CONTIGUOUS ARRAYS
POP P,X2
POP P,N
HRRZ T,N
MOVE N,T
LFL: MOVE TT,(X2)
FSBR TT,XL
FMPR TT,XSC
FIX TT
MOVEM TT,$$$PX(T)
MOVE TT,(Y2)
FSBR TT,YL
FMPR TT,YSC
FIX TT
MOVEM TT,$$$PY(T)
ADDI X2,1
ADDI Y2,1
SOJG T,LFL
JSR POLYUP
move 12,ac12
move 16,ac16
JRST @RETAD
SAVN: 0
POLYUP: 0 ;ROUTINE TO FILL IN A POLYGON
MOVEM N,SAVN
MOVEI I,1
MOVEM I,$$$RNK+1 ;PHASE 1, GENERATE AN
ILOP: AOS II,I ;INVERSE RANKING
MOVE T,$$$PY(I) ;KEYED ON Y VALUES
MOVEI J,1
JLOP: MOVE JJ,$$$RNK(J)
CAML T,$$$PY(JJ)
JRST NOXCH
EXCH II,$$$RNK(J)
MOVE T,$$$PY(II)
NOXCH: CAIGE J,-1(I)
AOJA J,JLOP
MOVEM II,$$$RNK(I)
CAMGE I,N
JRST ILOP
MOVE T,$$$PX+1
MOVEM T,$$$PX+1(N)
MOVE T,$$$PY+1
MOVEM T,$$$PY+1(N)
MOVE T,$$$PX(N)
MOVEM T,$$$PX
MOVE T,$$$PY(N)
MOVEM T,$$$PY
MOVEI I,1
MOVEI J,0
MOVE II,$$$RNK(I)
MOVE Y1,$$$PY(II)
NEWPNT: HRLZ X1,$$$PX(II)
MOVE T,$$$PY-1(II)
SUB T,Y1
JUMPLE T,TRYLOW+1 ;FORGET IT IF THIS EDGE POINTS
SKIPG JJ,J ;UPWARDS
JRST HINS
HILP: CAMG X1,$$$LXS(JJ)
JRST HINS
MOVE TT,$$$LXS(JJ)
MOVEM TT,$$$LXS+1(JJ)
MOVE TT,$$$DXS(JJ)
MOVEM TT,$$$DXS+1(JJ)
MOVE TT,$$$NS(JJ)
MOVEM TT,$$$NS+1(JJ)
SOJG JJ,HILP
HINS: MOVEM T,$$$NS+1(JJ) ;INSERT LINE SEGS
MOVEM X1,$$$LXS+1(JJ) ;COMING INTO THE SCANLINE
HLRE X1,X1
SUB X1,$$$PX-1(II)
HRLZ X2,X1
HRRI X1,400000
ADD X2,X1
IDIVI X2,1(T)
MOVNM X2,$$$DXS+1(JJ)
ADDI J,1
TRYLOW: HRLZ X1,$$$PX(II)
MOVE T,$$$PY+1(II)
SUB T,Y1
JUMPL T,DRAWG ;IF THIS EDGE POINTS
SKIPG JJ,J ;UPWARDS, TIME TO DRAW
JRST LINS
LILP: CAMG X1,$$$LXS(JJ)
JRST LINS
MOVE TT,$$$LXS(JJ)
MOVEM TT,$$$LXS+1(JJ)
MOVE TT,$$$DXS(JJ)
MOVEM TT,$$$DXS+1(JJ)
MOVE TT,$$$NS(JJ)
MOVEM TT,$$$NS+1(JJ)
SOJG JJ,LILP
LINS: MOVEM T,$$$NS+1(JJ)
MOVEM X1,$$$LXS+1(JJ)
HLRE X1,X1
SUB X1,$$$PX+1(II)
HRLZ X2,X1
HRRI X1,400000
ADD X2,X1
IDIVI X2,1(T)
MOVNM X2,$$$DXS+1(JJ)
ADDI J,1
DRAWG: CAML I,SAVN
JRST DRAWM
ADDI I,1
SCNRE: MOVE II,$$$RNK(I)
SCNR: CAMN Y1,$$$PY(II)
JRST NEWPNT
DRAWM: MOVE JJ,J ;UPDATE EACH EDGE
SETZB T,II ;AND THEN
FLOP: MOVE X1,$$$LXS(JJ) ;MAKE UP DRAWING LIST
MOVE X2,$$$DXS(JJ)
ADDB X2,$$$LXS(JJ)
JSR FILIN
SOSL $$$NS(JJ)
TRCE T,1
JUMPE T,BLAR
MOVE X2,$$$LXS-1(JJ)
JSR FILIN
BLAR: SOJG JJ,FLOP
DRAWZ: HRRE X1,$$LOUT(II) ;DRAW THIS SET
HLRE X2,$$LOUT(II)
JSR HORUP
SOJG II,DRAWZ
NEXL: MOVN JJ,J ;REMOVE EXPIRED SEGMNTS
HRLZ JJ,JJ ;AND MAKE POINTS SORTED
MOVEI J,0 ;AGAIN, IN PREPARATION
LPO: SKIPL $$$NS+1(JJ) ;FOR NEXT SCANLINE
AOJA J,NELP
SLOOP: AOBJN JJ,LPO
JUMPLE J,@POLYUP
AOJA Y1,SCNRE
NELP: MOVE T,$$$LXS+1(JJ)
MOVE TT,$$$DXS+1(JJ)
MOVE TTT,$$$NS+1(JJ)
MOVEI II,-1(J)
FLOOP: CAMG T,$$$LXS(II)
JRST PFND
MOVE X1,$$$LXS(II)
MOVEM X1,$$$LXS+1(II)
MOVE X1,$$$DXS(II)
MOVEM X1,$$$DXS+1(II)
MOVE X1,$$$NS(II)
MOVEM X1,$$$NS+1(II)
SOJG II,FLOOP
PFND: MOVEM T,$$$LXS+1(II)
MOVEM TT,$$$DXS+1(II)
MOVEM TTT,$$$NS+1(II)
AOBJN JJ,LPO
AOJA Y1,SCNRE
FILIN: 0 ;ADD A LINE SEGMENT
HLRM X1,$$LOUT+1(II)
HLLM X2,$$LOUT+1(II)
AOJA II,@FILIN
END